package com.lqian.demo02.part5.common;

import com.lqian.demo02.utils.DruidPool;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;

import java.sql.SQLException;

/**
 * 优化，引入dbutils组件！
 * ResultSetHandler 提供的接口可以将数据库查询的数据进行封装（如返回集合，map）
 * @author：Melody_LQ
 * @time：2022/7/14 5:53 下午
 */
public class BaseDao<T> {
    static{
        DruidPool.getConnection();
    }
    //•QueryRunner：执行sql语句的类
    // –增、删、改：update();
    // –查询：query();
    private static QueryRunner queryRunner = new QueryRunner(DruidPool.getDataSource());

    /**
     *  利用QueryRunner的通用查询方法
     * @param sql SQL语句
     * @param resultSetHandler
     * 接口：ResultSetHandler  用于把结果封装成不同类型的对象。具体实现了如下：
     *      1）BeanHandler: 查询返回单个对象
     *      2）BeanListHandler: 查询返回list集合，集合元素是指定的对象
     *      3)  ArrayHandler, 查询返回结果记录的第一行，封装到对象数组, 即返回：Object[]
     *      4)  ArrayListHandler, 把查询的每一行都封装为对象数组，再添加到list集合中
     *      5)  ScalarHandler 查询返回结果记录的第一行的第一列  (在聚合函数统计的时候用)
     * @param params SQL语句的参数
     * @return 返回数据库查询的数据，并用resultSetHandler封装好的对象（T）
     * @throws SQLException
     */
    public T query(String sql, ResultSetHandler<T> resultSetHandler,Object...params) throws SQLException {
        return queryRunner.query(sql,resultSetHandler,params);
    }

    /**
     * 利用QueryRunner的通用增、删、改方法
     * @param sql SQL语句
     * @param params SQL语句的参数
     * @return 返回结果影响行数 >1 即表示查询成功
     * @throws SQLException
     */
    public int execute(String sql,Object...params) throws SQLException {
        int resultRows = 0;
        return resultRows = queryRunner.update(sql,params);
    }

}
